#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main() {


 //close(0);
 //close(2);
//close(1);

  // 几个常见的重定向有          > 输出           >> 追加             < 输入
 //int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);

  // 追加
 int fd = open("log.txt",O_WRONLY | O_CREAT | O_APPEND,0666);

  // 输入 
 // int fd = open("log.txt",O_RDONLY,0666);

  // 接下来我们进行关闭文件指针所指的 0 / 2 的位置，看看结果会出现什么结果 
  // 经过实验发现，当我们关闭 0 时 默认打印的输出语句fd的位置为0 也就是将文件的指针发生了改变，默认将新进来的文件分配给最小（0,1,2）这种形式的指针上
  // 接下来我们关闭1 ，会发生文件重定向

  // 接下来我们再将2号关闭，应该最后输出的文件fd的位置是2
  // 经过实验后，我们得到结果确实为2 
  // 因此文件描述符的分配规则是 在file_struct数组中，找到当前没有使用的最小的一个下标，做为新的文件描述符
 // 经过实验发现，我们在关闭文件1后，在显示器中不会打印fd 相关输出命令，然后再其log.txt中也没有显示fd的相关输出，我们进行刷新缓冲区的操作试试
// 经过刷新缓冲区后，对应的打印语句依然没有在显示器中打印，但是我们点击log.txt文件后，发现其打印的输出内容写到了log.txt文件中
  // 在C语言中重定向对应的接口函数为 dup2(int oldfd,int newfd); 官方解释为使 newfd 成为 oldfd 的副本，必要时先关闭 newfd，也就是说最终会留下oldfd，
  //那么对应的我们当前代码想实现的是我们需要将代码中打印的内容输出到log.txt文件中去，也就是说最终我们会留下log.txt，文件指针对应的标准输出1就被关闭了

  if(fd < 0) {
    perror("open");
    return 1;
  }

  // 执行dup2重定向操作
 // 重定向输出
   dup2(fd,1);
  // 重定向输入 
 //dup2(fd,0);

  // 应该第一次会打印3 因为文件默认是在第三个指针所指的位置
  printf(" open  fd:  %d\n",fd);
  fprintf(stdout,"open fd %d\n",fd);
  char *msg = "hello world";
  write(1,msg,strlen(msg));
  fflush(stdout);


//  char line[64];
//  while(1) {
//
//    printf("<");
//   if(fgets(line,strlen(line),fd) == NULL) break;
//    printf("%s\n",line);
//  }
//
//
  close(fd);

  return 0;
}
